#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <thread>

using namespace std;

string toHex(pthread_t tid)
{
    char buffer[64] = {0};
    snprintf(buffer,sizeof(buffer),"%p",tid);

    return buffer;
}

void* threadRoutine(void* args)
{
    while (true)
    {
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;

    pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");

    cout << "main thread : " << toHex(pthread_self()) << endl;

    cout << "main thread create thead done, new thread id : " << toHex(tid) << endl;

    pthread_join(tid,nullptr);

    return 0;
}


// //目前, 我们的原生线程, pthread库, 原生线程库
// //C++11 语言本身也已经支持多线程了 vs 原生线程库

// void threadrun()
// {
//     while (true)
//     {
//         cout << "I am a new thead for C++" << endl;
//     }
// }

// int main()
// {
//     thread t1(threadrun);

//     t1.join();

//     return 0;
// }

// class Request
// {
// public:
//     Request(int start, int end, const string &threadnmae)
//     :start_(start),end_(end),threadName_(threadnmae)
//     {}
// public:
//     int start_;
//     int end_;
//     string threadName_;

// };

// class Response
// {
// public:
//     Response(int result,int exitcode)
//     :result_(result),exitcode_(exitcode)
//     {}
// public:
//     int result_;    //计算结果
//     int exitcode_;  //计算结果是否可靠
// };

// void* sumCount(void* args)
// {
//     Request *rq = static_cast<Request*>(args);
//     Response *rsp = new Response(0,0);

//     for (int i = rq->start_; i <= rq->end_; i++)
//     {
//         rsp->result_ += i;
//     }

//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;

//     Request *rq = new Request(1,100,"thread 1");

//     pthread_create(&tid,nullptr,sumCount,rq);

  

//     void* ret;

//     pthread_join(tid,&ret);

//     Response* rsp = static_cast<Response*>(ret);

//     cout << "result : " << rsp->result_ << " ,exit code : " << rsp->exitcode_ << endl; 

//     delete rsp;
//     return 0;
// }

// int g_val = 100;

// //可以被多个执行流同时执行
// void show(const string &name)
// {
//     cout << name << "say#" << "hello world" << endl;
// }


// //new thread
// void *threadRoutine(void *args)
// {
//     const char* name = (const char*)args;

//     int cnt = 5;
//     while (true)
//     {
//         //cout << "new thread , pid: " << getpid() << endl;
//         printf("%s, pid: %d, g_val: %d, &g_val: %p\n",name, getpid(), g_val, &g_val);
       

//         //show("[new thread]");

//         sleep(1);
//         // g_val++;

//         cnt--;
//         if (cnt == 0) break;
//     }

//     //exit(100)  //直接调用exit是用来终止进程的!! , 不能直接终止线程

//     pthread_exit((void*)100);
//     //return (void*)1;// 走到这里默认线程退出了!
// }

// int main()
// {
//     PTHREAD_CANCELED;
//     //很大的数字
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");//不是系统调用

//     sleep(1);

//     //pthread_cancel(tid);

//     // while (true)
//     // {
//     //     printf("main thread pid: %d, g_val: %d, &g_val: %p, create new thread tid: %ul\n",getpid(),g_val,&g_val,tid);
//     //    // cout << "main thread, pid: " << getpid() << ",g_val: " << g_val << ", &g_val: " << &g_val << endl;
//     //     //show("[main thread]");


//     //     sleep(1);
//     //     g_val++;
//     // } 

//     //sleep(7);

//     void* retval;

//     pthread_join(tid,&retval);

//     cout << "main thread quit ..., ret: " << (long long int)retval << endl;

//     return 0;
// }